home *** CD-ROM | disk | FTP | other *** search
Lisp/Scheme | 1988-04-07 | 1.8 KB | 52 lines | [TEXT/ttxt] |
- ;; Larry Mulcahy 1988
-
- ; Common Lisp-like Require & Provide
- ; Require-provide loops are permitted. To guard against infinite recursion,
- ; provides should appear in a file before requires.
- ; The global variable *modules* gets bound to the list of modules which are
- ; present in memory.
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; make-sure-*modules*-bound
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun make-sure-*modules*-bound ()
- (if (not (boundp '*modules*))
- (setq *modules* nil)))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; determine-require-filename
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun determine-require-filename (what where)
- (or where
- (let ((name (string-downcase (symbol-name what)))
- (ext *lisp-extension*))
- (strcat name ext))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; require
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun require (what &optional where)
- (make-sure-*modules*-bound)
- (if (not (member what *modules*))
- (let ((filename (determine-require-filename what where)))
- (load filename :verbose *load-verbose*)
- (if (not (member what *modules*))
- (progn
- (princ "warning: ")
- (princ filename)
- (princ " failed to provide ")
- (princ what)
- (terpri))))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; provide
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun provide (what)
- (make-sure-*modules*-bound)
- (if (not (member what *modules*))
- (setq *modules* (cons what *modules*))))
-